/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Bdd.ControllerBDD;
import Main.Toolbox;
import Model.Adherent;
import Model.Droits;
import Model.DroitsPK;
import Model.Utilisateur;
import java.io.IOException;
import java.security.MessageDigest;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet(name = "ControllerUser", urlPatterns = { "/Utilisateur/*" })
public class ControllerUser extends HttpServlet
{
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {

        String pathInfo = request.getPathInfo();

        if (pathInfo.equals("/add"))
        {
            List<Adherent> la = (List<Adherent>) getServletContext().getAttribute("adherents");
            request.setAttribute("listAdherents", la);
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/admin/user-add.jsp");
            rd.forward(request, response);
        }
        else if (pathInfo.equals("/addForm")){
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/admin/user-add.jsp");
            // Récupération des données du formulaire
            String login = request.getParameter("user");
            String pass = request.getParameter("pass");
            String idMembre = request.getParameter("adherent");
            String droit = request.getParameter("level");
            
            if (login != null && pass != null && idMembre != null && droit != null)
            {
                if(!login.trim().equals("") && !pass.trim().equals("") && !idMembre.trim().equals("") && !droit.trim().equals(""))
                {
                    try
                    {
                        Utilisateur u = new Utilisateur();
                        u.setLogin(login);
                        u.setPassword(this.passwordEncoder(pass));
                        u.setLevel(u.getLevelId(droit));
                        u.setDateCreation(Toolbox.toDBDateFormat(Toolbox.dateToString(new GregorianCalendar().getTime())));
                        Adherent a = this.getAdherentFromId(Integer.parseInt(idMembre));
                        u.setAdherentidAdherent(a);
                        a.setUtilisateur(u);
                        ControllerBDD.getINSTANCE().add(u);
                        
                        DroitsPK dpk = new DroitsPK();
                        dpk.setIdUtilisateur(u.getIdUtilisateur());
                        Droits d = new Droits(dpk);
                        d.setDroit(d.getDroitFromLevel(droit));
                        d.setLogin(login);
                        d.setUtilisateur(u);
                        a.setUtilisateur(u);
                        ControllerBDD.getINSTANCE().add(d);
                        
                        request.setAttribute("message", "<div id=\"success\"><b>Opération réussie.</b><br />L'utilisateur a été ajouté avec succès.</div>");
                    }
                    catch (ParseException ex)
                    {
                        Logger.getLogger(ControllerUser.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    catch(Exception e)
                    {
                        Logger.getLogger(ControllerUser.class.getName()).log(Level.SEVERE, null, e);
                    }
                }                
                else
                {
                    request.setAttribute("message", "<div id=\"failure\"><b>Une erreur est survenue.</b><br />Un ou plusieurs champs sont manquants !</div>");
                }
            }
            else
            {
                request.setAttribute("message", "<div id=\"failure\"><b>Une erreur est survenue.</b><br />Des éléments sont NULL !</div>");
            }
            // redirect
            rd.forward(request, response);
        }
        /*
        else if (pathInfo.equals("/delete")){
            String id = request.getParameter("id");
            if(id != null){
                
            }
        }
        */
        else if (pathInfo.equals("/editPassword")){
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/account/edit-pass.jsp");
            // Récupération des données du formulaire
            String curpass = request.getParameter("curpass");
            String newpass = request.getParameter("newpass");
            String confpass = request.getParameter("confpass");

            if (curpass != null && newpass != null && confpass != null){
                if(!curpass.trim().equals("") && !newpass.trim().equals("") && !confpass.trim().equals("")){
                    String login = request.getSession().getAttribute("login").toString();
                    Utilisateur u = getUserFromUsername(login);
                    if(u != null){
                        if(u.getPassword().equals(passwordEncoder(curpass))){
                            u.setPassword(passwordEncoder(newpass));
                            ControllerBDD.getINSTANCE().update(u);
                            request.setAttribute("message", "<div id=\"success\"><b>Opération réussie.</b><br />Votre mot de passe a été mis à jour avec succès.</div>");
                        }
                        else
                        {
                            request.setAttribute("message", "<div id=\"failure\"><b>Une erreur est survenue.</b><br />Le mot de passe actuel est incorrect !</div>");
                        }
                    }
                }
                else
                {
                    request.setAttribute("message", "<div id=\"failure\"><b>Une erreur est survenue.</b><br />Un ou plusieurs champs sont manquants !</div>");
                }
            }
            else
            {
                request.setAttribute("message", "<div id=\"failure\"><b>Une erreur est survenue.</b><br />Des éléments sont NULL !</div>");
            }
            // redirect
            rd.forward(request, response);
        }
        else if (pathInfo.equals("/edit")){
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/account/edit-pass.jsp");
            rd.forward(request, response);
        }
        else
        {
            List<Adherent> la = (List<Adherent>) getServletContext().getAttribute("adherents");
            List<Utilisateur> lu = new ArrayList<Utilisateur>();
            for(Adherent a : la){
                if(a.getUtilisateur() != null)
                {
                    lu.add(a.getUtilisateur());
                }
            }
            request.setAttribute("listUsers", lu);
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/admin/user-list.jsp");
            rd.forward(request, response);
        }
    }
    
    public Adherent getAdherentFromId(int id){
        List<Adherent> la = (List<Adherent>) getServletContext().getAttribute("adherents");
        for (Adherent a : la){
            if (a.getIdAdherent() == id) return a;
        }
        return null;
    }
   
    private Utilisateur getUserFromUsername(String user){
        List<Adherent> la = (List<Adherent>) getServletContext().getAttribute("adherents");
        for(Adherent a : la){
            if(a.getUtilisateur().getLogin().equals(user)) return a.getUtilisateur();
        }
        return null;
    }
    
    public String decode(byte[] hash) {  
        StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < hash.length; i++) {  
            int v = hash[i] & 0xFF; 
            if(v < 16) {
                sb.append("0"); 
            }
            sb.append(Integer.toString(v, 16)); 
        }  
        return sb.toString();
    }
    
    public String passwordEncoder(String plainText) {
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("SHA-256");
            digest.reset();

            byte rawPassword[] = digest.digest(plainText.getBytes("UTF-8"));
            return decode(rawPassword);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo()
    {
        return "Short description";
    }// </editor-fold>
}
